package org.lanqiao.tjut.action;

import java.util.List;

import javax.annotation.Resource;

import org.lanqiao.tjut.bean.StudentBean;
import org.lanqiao.tjut.service.IStudentInfoService;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;

/*
 * 使用RestController 注解，表名该controller是一个支持RESTFul形式的控制层的类
 */
@RestController
public class RESTFulServerAction {

	/*
	 * 使用注解@Resource层，依赖注入该属性的值，依赖于与变量名同名的一个注解对象
	 * 注意：该变量的声明使用接口，该变量通过依赖关系注入的对象值是该接口的一个具体的实现类的实例对象， 
	 * 此处使用了面向接口的编程思想
	 */
	@Resource
	private IStudentInfoService stuS;

	/**
	 * 查询ALL 
	 * RESTFul-GET方式请求 /stu/ 返回所有的学生信息列表
	 * 
	 * @return json对象
	 */
	@RequestMapping(value = "/stu/", method = RequestMethod.GET)
	public ResponseEntity<List<StudentBean>> selectAllSutdentInfo() {
		// 调用到层进行数据库查询所有学生信息
		List<StudentBean> lstStus = stuS.selectAllSutdentInfo();
		// 根据查询结果返回相关的响应response内容
		if (lstStus.isEmpty()) {
			// You many decide to return HttpStatus.NOT_FOUND
			return new ResponseEntity<List<StudentBean>>(HttpStatus.NO_CONTENT);
		}
		return new ResponseEntity<List<StudentBean>>(lstStus, HttpStatus.OK);
	}

	/**
	 * 查询Id 
	 * RESTFul-GET 方式请求 /stu/17 返回id为17的学生信息
	 * 
	 * @return json对象
	 */
	// 如果{}中的参数和方法形参中的参数名一致，可以不使用@PathVariable注解
	@RequestMapping(value = "/stu/{sid}", method = RequestMethod.GET, 
			produces = MediaType.APPLICATION_JSON_VALUE)
	public ResponseEntity<StudentBean> selectAllSutdentInfo(@PathVariable("sid") Long sid) {
		// 调用到层进行数据库查询所有学生信息
		StudentBean stuB = stuS.selectByPrimaryKey(sid);
		// 根据查询结果返回相关的响应response内容
		if (stuB == null) {
			// You many decide to return HttpStatus.NOT_FOUND
			return new ResponseEntity<StudentBean>(HttpStatus.NO_CONTENT);
		}
		return new ResponseEntity<StudentBean>(stuB, HttpStatus.OK);
	}

	/**
	 * 新增
	 * RESTFul-POST 方式请求 /stu/ 通过学生信息对象的JSON参数新建学生信息对象
	 * 
	 * @return void
	 */
	@RequestMapping(value = "/stu/", method = RequestMethod.POST)
	public ResponseEntity<Void> saveStuInfo(@RequestBody StudentBean stu,UriComponentsBuilder ucBuilder) {
		System.out.println("新建学生信息：" + stu.toString());
		// TODO 调用service层新增学生信息
		HttpHeaders headers = new HttpHeaders();
		// 将查询新增数据对象的rui连接的内容设置到hedder中，发挥到客户端，
		// 客户端通过解析hedder中的location的内容，可以获取查询的get 的uri获取新增的学生对象的信息
		headers.setLocation(ucBuilder.path("/stu/{sid}").buildAndExpand(stu.getStuId()).toUri());  
		return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
	}

	/**
	 * 新增
	 * RESTFul-POST 方式请求 /stu/ 通过学生信息对象的JSON参数新建学生信息对象
	 * 
	 * @return void
	 */
//	@RequestMapping(value = "/stu/", method = RequestMethod.POST)
//	public ResponseEntity<List<StudentBean>> saveStuInfo(@RequestBody StudentBean stu) {
//		System.out.println("新建学生信息：" + stu.toString());
//		// TODO 调用service层新增学生信息
//		// 调用到层进行数据库查询所有学生信息
//		List<StudentBean> lstStus = stuS.selectAllSutdentInfo();
//		return new ResponseEntity<List<StudentBean>>(lstStus, HttpStatus.OK);
//	}
	
	
	/**
	 * 修改
	 * RESTFul-PUT 方式请求 /stu/17 更新id为17的对象发送json格式中的学生对象信息
	 * 
	 * @return json对象
	 */
	@RequestMapping(value = "/stu/{sid}", method = RequestMethod.PUT)
	public ResponseEntity<StudentBean> updateStuInfoById(@PathVariable("sid")Long sid, 
			@RequestBody StudentBean stu) {
		System.out.println("Updating StudentBean： " + sid);
		System.out.println("Updating StudentBean Info： " + stu.toString());

		// TODO 调用service层修改学生信息

		// 将修改的学生信息重新查询获取
		StudentBean stuB = stuS.selectByPrimaryKey(sid);

		if (stuB == null) {
			System.out.println("User with id " + sid + " not found");
			return new ResponseEntity<StudentBean>(HttpStatus.NOT_FOUND);
		}

		return new ResponseEntity<StudentBean>(stuB, HttpStatus.OK);
	}

	/**
	 * 修改 
	 * RESTFul-DELETE 方式请求/stu/17 删除学生id为17的学生信息对象
	 * 
	 * @return json对象
	 */
	@RequestMapping(value = "/stu/{sid}", method = RequestMethod.DELETE)
	public ResponseEntity<String> deleteStuInfoById(@PathVariable("sid") Long sid) {
		System.out.println("删除学生信息-id:" + sid);

		int i = stuS.deleteStudentInfoById(sid);
		if (i == 0) {
			// 删除失败
			System.out.println("没有该学生信息或者删除失败 ");
			return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
		} else {
			// 删除成功
			return new ResponseEntity<String>("删除成功", HttpStatus.OK);
		}

	}

	/**
	 * 修改 
	 * RESTFul-DELETE 方式请求/stu/ 删除所有学生信息
	 * 
	 * @return json对象
	 */
	@RequestMapping(value = "/stu/", method = RequestMethod.DELETE)
	public ResponseEntity<String> deleteAllStuInfo() {

		int i = 1;// stuS.deleteStudentInfoById();
		if (i == 0) {
			// 删除失败
			System.out.println("没有学生信息或者删除失败 ");
			return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
		} else {
			// 删除成功
			return new ResponseEntity<String>("删除所有学生成功", HttpStatus.OK);
		}
	}
}
